package com.ms.orm.dboperator;

import com.ms.orm.conditions.Wrapper;
import com.ms.orm.meta.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author zdh
 *
 */
public interface DbOperatorAdaptor {


    /**
     * 保存对象
     * @param entity
     */
    void save(Object entity);

    /**
     * 更新对象
     * @param entity
     * @return
     */
    int update(Object entity);


    /**
     * 根据 实体 Class查找对象
     * @param entityClass
     * @return
     */
    List<Object> findAll(Class<?> entityClass);

    /**
     * 查询实体类
     * @param entityClass
     * @param id
     * @return
     */
    Object findById(Class<?> entityClass, Serializable id) ;

    /**
     * 根据实体 Class 及id 删除 记录
     * @param entityClass
     * @param id
     * @return
     */
    int deleteById(Class<?> entityClass,Serializable id) ;


    /**
     * 通过 Map 删除
     * @param columnMap 表字段 map 对象
     * @return
     */
     int deleteByMap(Class<?> entityClass,Map<String, Object> columnMap);


    /**
     * 通过 Wrapper 删除
     * @param entityClass
     * @param updateWrapper
     * @return
     */
     int delete(Class<?> entityClass,Wrapper<Object> updateWrapper);

    /**
     * 通过 ids 批量删除
     * @param entityClass
     * @param idList
     * @return
     */
     int deleteBatchIds(Class<?> entityClass,Collection<?> idList);

    /**
     * @param bean
     * @param updateWrapper 更新条件
     * @return int 更新成功值
     */
     int update(Object bean,Wrapper updateWrapper);


    /**
     * 通过 ids 查询
     * @param entityClass
     * @param idList
     * @return List<Object>
     */
     List<Object> selectBatchIds(Class<?> entityClass,Collection<? extends Serializable> idList);


    /**
     * 11、查询（根据 columnMap 条件）
     * @param entityClass 表字段 map 对象
     * @param columnMap 查找到到实体list
     * @return
     */
    List<Object> selectByMap(Class<?> entityClass,Map<String, Object> columnMap);

    /**
     * 查找对象 通过条件构建器查询,如果结果存在多条则 抛异常
     * @param entityClass
     * @param wrapper
     * @return
     */
    Object selectOne(Class<?> entityClass, Wrapper wrapper);

    /**
     * 查询记录数
     * @param queryWrapper
     * @return
     */
     Long selectCount(Class<?> entityClass,Wrapper queryWrapper);


    /**
     * 根据 queryWrapper 条件，查询全部记录
     * @param queryWrapper
     * @return
     */
     List<Map<String, Object>> selectMaps(Class<?> entityClass,Wrapper queryWrapper);

    /**
     * 15、根据 queryWrapper 条件，查询全部记录
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @return 返回列表  List<Object>
     */
    List<Object> selectList(Class<?> entityClass,Wrapper queryWrapper);


    /**
     * 根据 queryWrapper 条件，查询记录中的 某一列
     * @param entityClass
     * @param queryWrapper
     * @return
     */
    List<Object> selectOneColumnList(Class<?> entityClass,Wrapper<Object> queryWrapper);


    /**
     * 分页查询
     * @param entityClass
     * @param page
     * @param queryWrapper
     * @param <P>
     * @return
     */
     <P extends IPage<Object>> P selectPage(Class<?> entityClass,P page, Wrapper<Object> queryWrapper);


    /**
     * 根据 Wrapper 条件，查询全部记录（并翻页）
     * @param entityClass
     * @param page 分页查询条件
     * @param queryWrapper 实体对象封装操作类
     * @param <P>
     * @return
     */
    <P extends IPage<Map<String, Object>>> P selectMapsPage(Class<?> entityClass, P page,Wrapper<Object> queryWrapper);


    /**
     * 批量插入
     * @param entityClass
     * @param list
     * @return
     */
     int[] batchSave(Class<?> entityClass,List<Object> list);
}
